package com.t.bricks.bussiness.service.person.impl;

import java.util.Date;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.t.bricks.bussiness.db.dao.person.PersonDao;
import com.t.bricks.bussiness.db.entity.person.Person;
import com.t.bricks.bussiness.db.entity.person.base.PersonBase;
import com.t.bricks.bussiness.service.person.PersonService;
import com.t.bricks.model.MsgEmity;
import com.t.bricks.utils.function.data.IntegerUtil;
import com.t.bricks.utils.spring.ModuleUtil;

/**
 * 人员信息'Person表'基本业务操作类接口实现
 */
@Service
public class PersonServiceImpl implements PersonService<Person> {

	@Autowired
	private PersonDao<Person> personDao;

	/**
	 * 新增
	 * @param person 人员信息 对象实体,注意:跨包访问时可能会是json字符串
	 * @return
	 */
	@Override
	public MsgEmity add(Object person) {
		MsgEmity me = ModuleUtil.objToEntity(person, Person.class);//转换数据,因为如果传递的是String,则可能是进行了跨包访问,要先用Json转换成实体对象
		if (!me.isSuccess()) {
			return me;
		}
		
		Person personData = me.getData();
		
		me = ModuleUtil.validDbEntityByAdd(personData);// 通用的基本数据验证,如果要进行比较复杂的数据验证则可以屏蔽掉此方法自行编写
		if (!me.isSuccess()) {
			return me;
		}
		
		me = ModuleUtil.validDbEntityRepeatByAdd((PersonBase)personData, personDao);//查询数据库,验证数据是否有重复,因验证数据重复的方式比较复杂,直接在sql脚本中处理
		if (!me.isSuccess()) {// 在false下,如果返回8028则表示数据库查询异常,否则返回后4位是8026的数据,如xxx8026,从万位起表示从数据库中查询的结果
			String tmp = me.getData().toString();
			tmp = tmp.substring(0, tmp.length() -4);// 数据一定不小于4位
			tmp = String.format("%05d", IntegerUtil.strToInt(tmp, 0));//补0,补齐5位

			StringBuilder sb = new StringBuilder();
			if ("1".equals(tmp.substring(0, 1))) {
				sb.append("身份证，");
			}

			if ("1".equals(tmp.substring(1, 2))) {
				sb.append("邮箱，");
			}
			
			if ("1".equals(tmp.substring(2, 3))) {
				sb.append("微信，");
			}
			
			if ("1".equals(tmp.substring(3, 4))) {
				sb.append("手机，");
			}
			
			if ("1".equals(tmp.substring(4, 5))) {
				sb.append("工号，");
			}
			
			sb.setLength(sb.length() -1);//一定不可能出现长度为0不够减的情况
			sb.append("存在重复");
			
			return me.setMsg(sb.toString());// 发现重复数据后不进行其它业务处理则退出时,必须清理返回数据
		}
		
		personData.setsId(null);//清空记录编号
		
		me = ModuleUtil.supplyDbEntityAttrByAdd(personData);// 补充数据,如添加id、当前用户、当前时间等
		if (!me.isSuccess()) {
			return me;
		}

		//--提交数据保存--//
		return personDao.add(personData);
	}

	/**
	 * 修改
	 * @param person 人员信息 对象实体,注意:跨包访问时可能会是json字符串
	 * @return
	 */
	@Override
	public MsgEmity edit(Object person) {
		MsgEmity me = ModuleUtil.objToEntity(person, Person.class);//转换数据,因为如果传递的是String,则可能是进行了跨包访问,要先用Json转换成实体对象
		if (!me.isSuccess()) {
			return me;
		}
		
		Person personData = me.getData();
		
		me = ModuleUtil.validBaseDataByEdit(personData);// 通用的基本数据验证(编辑),如果要进行比较复杂的数据验证则可以屏蔽掉此方法自行编写
		if (!me.isSuccess()) {
			return me;
		}
		
		me = ModuleUtil.validDbEntityRepeatByEdit((PersonBase)personData, personDao);// 查询数据库,验证数据是否有重复,因验证数据重复的方式比较复杂,直接在sql脚本中处理
		if (!me.isSuccess()) {// 在false下,如果返回8028则表示数据库查询异常,否则返回后4位是8026的数据,如xxx8026,从万位起表示从数据库中查询的结果
			String tmp = me.getData().toString();
			tmp = tmp.substring(0, tmp.length() -4);// 数据一定不小于4位
			tmp = String.format("%05d", IntegerUtil.strToInt(tmp, 0));//补0,补齐5位

			StringBuilder sb = new StringBuilder();
			if ("1".equals(tmp.substring(0, 1))) {
				sb.append("身份证，");
			}

			if ("1".equals(tmp.substring(1, 2))) {
				sb.append("邮箱，");
			}
			
			if ("1".equals(tmp.substring(2, 3))) {
				sb.append("微信，");
			}
			
			if ("1".equals(tmp.substring(3, 4))) {
				sb.append("手机，");
			}
			
			if ("1".equals(tmp.substring(4, 5))) {
				sb.append("工号，");
			}
			
			sb.setLength(sb.length() -1);//一定不可能出现长度为0不够减的情况
			sb.append("存在重复");
			
			return me.setMsg(sb.toString());// 发现重复数据后不进行其它业务处理则退出时,必须清理返回数据
		}
		
		ModuleUtil.supplyDbEntityAttrByEdit(personData);// 补充数据
		
		//--提交数据保存--//
		return personDao.edit(personData);//注意:更新成功后对象属性iVersion值将被+1
	}

	/**
	 * 停用
	 * @param sId
	 * @return
	 */
	@Override
	public MsgEmity stop(String sId) {
		if (null == sId || "".equals(sId.trim())) {
			return new MsgEmity(false, "人员编号参数不能为空！", 8001);
		}
		
		return personDao.stop(sId, ModuleUtil.currentLoginUserId());
	}

	/**
	 * 启用
	 * @param sId
	 * @param dEndTime
	 * @return
	 */
	@Override
	public MsgEmity start(String sId, Date dEndTime) {
		if (null == sId || "".equals(sId.trim())) {
			return new MsgEmity(false, "人员编号参数不能为空！", 8001);
		}
		
		if (null == dEndTime) {
			return new MsgEmity(false, "必须设定账户有效期！", 8002);
		}
		
		if (dEndTime.before(new Date())) {
			return new MsgEmity(false, "有效期必须比当前时间要大！", 8003);
		}
		
		return personDao.start(sId, dEndTime, ModuleUtil.currentLoginUserId());
	}

	/**
	 * 根据部门编号查询员工
	 * @param sDeparmentId
	 * @param iMainDeparment 仅限主部门
	 * @return
	 */
	@Override
	public MsgEmity findByDepartmentId(String sDeparmentId, Integer iMainDeparment) {
		return personDao.findByDepartmentId(sDeparmentId, iMainDeparment);
	}
	
}
